import javax.swing.SortingFocusTraversalPolicy;

public class Tools{
    public static String encryption(String str){  //加密
        try{
            checkPassword(str);   //检查密码
            StringBuffer password = new StringBuffer(str); //使用StringBuffer获得密码
            for(int i = 0;i < str.length();i++){
                password.setCharAt(i, (char)(password.charAt(i)+(i+1)+3));
            } //用setCharAt方法,对密码的每个字符加上位置和偏移值3
            char temp = password.charAt(0);
            password.setCharAt(0, password.charAt(password.length()-1));
            password.setCharAt(password.length()-1,temp); //创建一个临时变量,交换密码的第一位和最后一位
            password.reverse();  //用reverse方法反转
            return "加密后的结果是: " +password.toString();   //返回结果
            }
        catch(MyException ex){
            return "请输入数字或者大小写字母.密码长度不超过16";  //密码不合理接受异常并返回提示信息
        }
          
    }
    
    
    public static String decryption(String str){  //解密
        if(str.length()>16){       //审查
            return "请设定密码长度不超过16";  
        }
        else{
            StringBuffer password = new StringBuffer(str);
            password.reverse();  //先反转
            char temp = password.charAt(0);
            password.setCharAt(0, password.charAt(password.length()-1));
            password.setCharAt(password.length()-1,temp);   //交换第一位和最后一位
            for(int i = 0;i < str.length();i++){
                password.setCharAt(i, (char)(password.charAt(i)-(i+1)-3));
            }  //回到开始值
            return "解密后的结果是: " + password.toString();
            }
    }

    public static void expresstion(){ //页面显示
        String str1 = "        ==================================";
        String str2 = "               欢迎使用密码管理系统";
        System.out.printf("%s\n%s\n%s\n",str1,str2,str1);
    }

    public static String judgePassword(String str){ //判断密码强度
        try {
            checkPassword(str);   //审查
        
        
            boolean num = false;  //判断是否有数字和字母,出现一次即为true
            boolean low = false;
            boolean up = false;
            for(int i = 0; i < str.length();i++){
                if(Character.isDigit(str.charAt(i))){
                    num = true;
                }
                if(Character.isLowerCase(str.charAt(i))){
                    low = true;
                }
                if(Character.isUpperCase(str.charAt(i))){
                    up = true;
                }
            }

            if(str.length()<8 || str.matches("\\p{Alpha}{8,}|\\d{8,}")){ //利用正则匹配判断强中弱
                return "密码的强度是:弱"; 
            }
            else if(str.length()>=8 && num && (low^up)){
                return "密码的强度是:中";
            }
            else { //(str.length()>=8 && num && low && up)
                return "密码的强度是:强";
            }
        } 
        catch (MyException e) {
            return "请输入数字或者大小写字母.密码长度不超过16";
        }
    }

    public static String createPassword(int passwordLength){  //生成强密码
        if(passwordLength <8 || passwordLength >16){  //审查
            return "请设定的密码长度为8-16";
        }
        else{
            String password = "";
            boolean control = true;  //false意味着生成强密码成功退出循环
            while(control){
                for(int i = 0;i < passwordLength;i++){
                    int switchNum = (int)(Math.random()*4); //先分成大写字母、数字、小写字母,如果有需要,可给他们加权
                    char temp;  //每次生成一个字符
                    if(switchNum == 0){
                        temp =(char)('0' + (int)(Math.random()*10));
    
                    }
                    else if(switchNum == 1){
                        temp =(char)('a' + (int)(Math.random()*26));

                    }
                    else {
                        temp =(char)('A' + (int)(Math.random()*26));
                    }
                    password = password + temp;//一次次连接最终形成密码
                }
                if(password.matches(".*[A-Z].*") 
                    && password.matches(".*[0-9].*") 
                    && password.matches(".*[a-z].*")){  //审查,跟上面审查强密码的效果相同
                    control = false;
                }
            }
            return "生成的强密码为:" + password;  //返回
        }    
    }

    public static void checkPassword(String str) throws MyException{ //检查密码合理性,密码长度大于16||密码不是由字母和数字组成则抛出异常提示输入合理密码
        /* if(str.length()>16||str.length()==0){
                        throw new MyException();
                    }
                    for(int i = 0;i < str.length();i++){
                        if(!(Character.isLetterOrDigit(str.charAt(i)))){
                            throw new MyException();
                    }*/  //自己写方法
        //利用现成方法
        if(!str.matches("\\p{Alnum}{1,16}")){
            throw new MyException();   //扔出自定义异常,避免与其他异常混在一起
        }
    }
}

